package com.cy.sys.service.impl;

import java.util.List;

import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;

import com.cy.common.exception.ServiceException;
import com.cy.common.pojo.ZtreeNodes;
import com.cy.common.util.ShiroUtil;
import com.cy.sys.dao.SysMenuDao;
import com.cy.sys.dao.SysRoleMenuDao;
import com.cy.sys.pojo.SysMenu;
import com.cy.sys.service.SysMenuService;

/**
 *  此类实现了菜单接口的所有方法,定义菜单处理业务的逻辑
 * @author private
 *
 */
@Service
public class SysMenuServiceImpl implements SysMenuService {
	@Autowired
	private SysMenuDao sysMenuDao;
	@Autowired
	private SysRoleMenuDao sysRoleMenuDao;
	
	/** 
	 * 处理查询所有菜单
	 * 请求菜单使用TreeGrid进行呈现,所以直接查询所有记录即可
	 */
	@RequiresPermissions("sys:menu:view")
	@Override
	public List<SysMenu> findObjects() {
		List<SysMenu> menus = sysMenuDao.selectObjects();
		return menus;
	}

	/** 查询所有节点菜单进行Ztree呈现 */
	@Override
	public List<ZtreeNodes> doFindZtreeMenuNodes() {
		return sysMenuDao.selectNodes();
	}

	/** 菜单数据的保存 */
	@RequiresPermissions("sys:menu:add")
	@Transactional(rollbackFor = Exception.class)
	@Override
	public int doSaveObject(SysMenu sysMenu) {
		//1.校验参数
		if(sysMenu==null||sysMenu.getName()==null) 
			throw new IllegalArgumentException("请填写数据后再进行保存!");
		if(StringUtils.isEmpty(sysMenu.getUrl()))
			throw new IllegalArgumentException("请填写菜单URL信息");
		if(StringUtils.isEmpty(sysMenu.getPermission()))
			throw new IllegalArgumentException("请填写授权标识");
		//2.保存菜单
		sysMenu.setCreatedUser(ShiroUtil.getUserName());
		int rows = sysMenuDao.insertObject(sysMenu);
		if(rows<1) throw new ServiceException("未知错误,保存菜单信息失败!");
		//返回结果
		return rows;
	}

	/** 修改菜单数据 */
	@RequiresPermissions("sys:menu:update")
	@Transactional(rollbackFor = Exception.class)
	@Override
	public int doUpdateObject(SysMenu sysMenu) {
		//1.校验参数
		if(sysMenu==null||sysMenu.getName()==null) 
			throw new IllegalArgumentException("请填写数据后再进行保存!");
		if(StringUtils.isEmpty(sysMenu.getId()))
			throw new IllegalArgumentException("此用户信息无效!");
		if(StringUtils.isEmpty(sysMenu.getUrl()))
			throw new IllegalArgumentException("请填写菜单URL信息");
		if(StringUtils.isEmpty(sysMenu.getPermission()))
			throw new IllegalArgumentException("请填写授权标识");
		//2.修改菜单信息
		sysMenu.setModifiedUser(ShiroUtil.getUserName());
		int rows = sysMenuDao.updateObject(sysMenu);
		if(rows<1) throw new ServiceException("未知错误,此菜单可能已经不存在!");
		//3.返回结果
		return rows;
	}

	/** 进行菜单的删除 */
	@RequiresPermissions("sys:menu:delete")
	@Transactional(rollbackFor = Exception.class)
	@Override
	public int doDeleteObject(Integer id) {
		//1.校验参数
		if(id==null || id<1) throw new IllegalArgumentException("请先选择要删除的菜单!");
		//2.校验是否有子菜单
		int childs = sysMenuDao.selectChildsByParentId(id);
		if(childs>0) throw new ServiceException("请先删除此菜单下的子菜单!");
		//3.先删除角色菜单关联关系
		int rows = sysRoleMenuDao.deleteObjectByMenuId(id);
		//4.然后处理删除
		rows = sysMenuDao.deleteObjectById(id);
		if(rows==0) throw new ServiceException("删除失败,此菜单可能已经不存在!");
		//4.返回结果
		return rows;
	}
}
